home *** CD-ROM | disk | FTP | other *** search
/ The Very Best of Atari Inside / The Very Best of Atari Inside 1.iso / mint / mntlib43 / mntlib / bzero.cpp < prev    next >
C/C++ Source or Header  |  1994-01-15  |  3KB  |  139 lines

  1. |    new version of bcopy and memset
  2. |    uses movem to set 256 bytes blocks faster.
  3. |    Alexander Lehmann    alexlehm@iti.informatik.th-darmstadt.de
  4. |    sortof inspired by jrbs bcopy
  5. |    has to be preprocessed (int parameter in memset)
  6.  
  7.     .text
  8.     .even
  9.  
  10. #ifdef Lmemset
  11.     .globl _memset
  12.  
  13. |    void *memset( void *dest, int val, size_t len );
  14. |    returns dest
  15. |    two versions for 16/32 bits
  16.  
  17. _memset:
  18.     movl    sp@(4),a0    | dest
  19. #ifdef __MSHORT__
  20.     movb    sp@(9),d0    | value
  21. # ifndef __SOZOBON__
  22.     movl    sp@(10),d1    | length
  23. # else
  24.     clrl    d1
  25.     movw    sp@(10),d1    | length
  26. # endif
  27. #else
  28.     movb    sp@(11),d0    | value
  29.     movl    sp@(12),d1    | length
  30. #endif
  31.     jeq    exit        | length==0? (size_t)
  32. #ifdef Lbzero
  33.     jra    do_set
  34. #endif
  35. #endif /* Lmemset */
  36.  
  37. #ifdef Lbzero
  38.     .globl _bzero
  39.     .globl __bzero
  40.  
  41. |    void bzero( void *dest, size_t length );
  42. |    void _bzero( void *dest, unsigned long length );
  43. |    return value not used (returns dest)
  44.  
  45. #ifdef __SOZOBON__
  46. _bzero:
  47.     movl    sp@(4),a0    | dest
  48.     clrl    d1
  49.     movw    sp@(8),d1    | length
  50.     jra    scommon
  51. #else
  52. _bzero:
  53. #endif
  54. __bzero:
  55.     movl    sp@(4),a0    | dest
  56.     movl    sp@(8),d1    | length
  57. scommon:
  58.     jeq    exit        | length==0? (size_t)
  59.     clrb    d0        | value
  60. #endif /* Lbzero */
  61.  
  62. do_set:             | a0 dest, d0.b byte, d1.l length
  63.     movel    d2,sp@-
  64.  
  65.     addl    d1,a0        | a0 points to end of area, needed for predec
  66.  
  67.     movw    a0,d2        | test for alignment
  68.     btst    #0,d2        | odd ?
  69.     jeq    areeven
  70.     movb    d0,a0@-     | set one byte, now we are even
  71.     subql    #1,d1
  72. areeven:
  73.     movb    d0,d2
  74.     lslw    #8,d0
  75.     movb    d2,d0
  76.     movw    d0,d2
  77.     swap    d2
  78.     movw    d0,d2        | d2 has byte now four times
  79.  
  80.     clrw    d0        | save length less 256
  81.     movb    d1,d0
  82.     lsrl    #8,d1        | number of 256 bytes blocks
  83.     jeq    less256
  84.     movml    d0/d3-d7/a2/a3/a5/a6,sp@-    | d2 is already saved
  85.                 | exclude a4 because of -mbaserel
  86.     movl    d2,d0
  87.     movl    d2,d3
  88.     movl    d2,d4
  89.     movl    d2,d5
  90.     movl    d2,d6
  91.     movl    d2,d7
  92.     movl    d2,a2
  93.     movl    d2,a3
  94.     movl    d2,a5
  95.     movl    d2,a6
  96. set256:
  97.     movml    d0/d2-d7/a2/a3/a5/a6,a0@-    | set 5*44+36=256 bytes
  98.     movml    d0/d2-d7/a2/a3/a5/a6,a0@-
  99.     movml    d0/d2-d7/a2/a3/a5/a6,a0@-
  100.     movml    d0/d2-d7/a2/a3/a5/a6,a0@-
  101.     movml    d0/d2-d7/a2/a3/a5/a6,a0@-
  102.     movml    d0/d2-d7/a2-a3,a0@-
  103.     subql    #1,d1
  104.     jne    set256            | next, please
  105.     movml    sp@+,d0/d3-d7/a2/a3/a5/a6
  106. less256:            | set 16 bytes blocks
  107.     movw    d0,sp@-     | save length below 256 for last 3 bytes
  108.     lsrw    #2,d0        | number of 4 bytes blocks
  109.     jeq    less4        | less that 4 bytes left
  110.     movw    d0,d1
  111.     negw    d1
  112.     andw    #3,d1        | d1 = number of bytes below 16 (-n)&3
  113.     subqw    #1,d0
  114.     lsrw    #2,d0        | number of 16 bytes blocks minus 1, if d1==0
  115.     addw    d1,d1        | offset in code (movl two bytes)
  116.     jmp    pc@(2,d1:w)    | jmp into loop
  117. set16:
  118.     movl    d2,a0@-
  119.     movl    d2,a0@-
  120.     movl    d2,a0@-
  121.     movl    d2,a0@-
  122.     dbra    d0,set16
  123. less4:
  124.     movw    sp@+,d0
  125.     btst    #1,d0
  126.     jeq    less2
  127.     movw    d2,a0@-
  128. less2:
  129.     btst    #0,d0
  130.     jeq    none
  131.     movb    d2,a0@-
  132. none:
  133. exit_d2:
  134.     movl    sp@+,d2
  135. exit:
  136.     movl sp@(4),d0        | return dest (for memset only)
  137.     rts
  138.  
  139.